package action;

import com.opensymphony.xwork2.ActionSupport;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import model.Curso;
import model.Disciplina;

public class DisciplinaAction extends ActionSupport {

    private List<Disciplina> disciplinas;
    private Disciplina disciplina;
    private int codDisciplina;
    private String nomeDisciplina;
    private int codCurso;
    private List<Curso> cursos;
    private String operacao;
    private int[] periodos = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    private String listaPreRequisitos;
    private String readOnly;
    private String readOnlyCod;

    public String getReadOnlyCod() {
        return readOnlyCod;
    }

    public void setReadOnlyCod(String readOnlyCod) {
        this.readOnlyCod = readOnlyCod;
    }

    public String getReadOnly() {
        return readOnly;
    }

    public void setReadOnly(String readOnly) {
        this.readOnly = readOnly;
    }

    public String getListaPreRequisitos() {
        return listaPreRequisitos;
    }

    public void setListaPreRequisitos(String listaPreRequisitos) {
        this.listaPreRequisitos = listaPreRequisitos;
    }

    public int[] getPeriodos() {
        return periodos;
    }

    public void setPeriodos(int[] periodos) {
        this.periodos = periodos;
    }

    public String getOperacao() {
        return operacao;
    }

    public void setOperacao(String operacao) {
        this.operacao = operacao;
    }

    public List<Disciplina> getDisciplinas() {
        return disciplinas;
    }

    public void setDisciplinas(List<Disciplina> disciplinas) {
        this.disciplinas = disciplinas;
    }

    public Disciplina getDisciplina() {
        return disciplina;
    }

    public void setDisciplina(Disciplina disciplina) {
        this.disciplina = disciplina;
    }

    public int getCodDisciplina() {
        return codDisciplina;
    }

    public void setCodDisciplina(int codDisciplina) {
        this.codDisciplina = codDisciplina;
    }

    public String getNomeDisciplina() {
        return nomeDisciplina;
    }

    public void setNomeDisciplina(String nomeDisciplina) {
        this.nomeDisciplina = nomeDisciplina;
    }

    public int getCodCurso() {
        return codCurso;
    }

    public void setCodCurso(int codCurso) {
        this.codCurso = codCurso;
    }

    public List<Curso> getCursos() {
        return cursos;
    }

    public void setCursos(List<Curso> cursos) {
        this.cursos = cursos;
    }

    public String pesquisar() throws ClassNotFoundException, SQLException {
        cursos = Curso.obterCursos();

        if ((codCurso == 0) && (nomeDisciplina == null || nomeDisciplina.equals(""))) {
            disciplinas = Disciplina.obterDisciplinas();
        } else {
            if (codCurso != 0 && !nomeDisciplina.equals("")) {
                disciplinas = Disciplina.obterDisciplinasPorCursoENome(codCurso, nomeDisciplina);
            } else if (codCurso != 0) {
                disciplinas = Disciplina.obterDisciplinasPorCurso(codCurso);
            } else if (!nomeDisciplina.equals("")) {
                disciplinas = Disciplina.obterDisciplinasPorNome(nomeDisciplina);
            }
        }
        return "pesquisar";
    }

    public String incluir() throws ClassNotFoundException, SQLException {
        disciplinas = Disciplina.obterDisciplinas();
        cursos = Curso.obterCursos();
        readOnly = "";
        readOnlyCod = "";
        operacao = "Incluir";
        return "manter";
    }

    public String editar() throws ClassNotFoundException, SQLException {
        disciplinas = Disciplina.obterDisciplinas();
        cursos = Curso.obterCursos();
        operacao = "Editar";
        readOnly = "";
        readOnlyCod = "true";
        disciplina = Disciplina.obterDisciplina(codDisciplina);
        listaPreRequisitos = "";
        for (Disciplina preRequisito : disciplina.getDisciplinasForCodDisciplinaPreRequisito()) {
            listaPreRequisitos = listaPreRequisitos + preRequisito.getCodDisciplina() + ",";
        }
        return "manter";
    }
    
    public String excluir() throws ClassNotFoundException, SQLException {
        disciplinas = Disciplina.obterDisciplinas();
        cursos = Curso.obterCursos();
        operacao = "Excluir";
        readOnly = "true";
        readOnlyCod = "true";
        disciplina = Disciplina.obterDisciplina(codDisciplina);
        listaPreRequisitos = "";
        for (Disciplina preRequisito : disciplina.getDisciplinasForCodDisciplinaPreRequisito()) {
            listaPreRequisitos = listaPreRequisitos + preRequisito.getCodDisciplina() + ",";
        }
        return "manter";
    }

    public String confirmar() throws SQLException, ClassNotFoundException {
        disciplinas = Disciplina.obterDisciplinas();
        cursos = Curso.obterCursos();

        boolean erro = false;
        if(disciplina.getCodDisciplina() == 0){
            erro = true;
            addFieldError("disciplina.codDisciplina", "Não pode ser NULO");
        }
        
        if(disciplina.getCurso() == null){
            erro = true;
            addFieldError("disciplina.curso.codCurso", "Não pode ser NULO");
        }
        
        if(erro){
            return INPUT;
        }
        
        List<String> elements = Arrays.asList(listaPreRequisitos.split(","));
        Set<Disciplina> preRequisitos;
        preRequisitos = new HashSet<Disciplina>();
        for (String elemento : elements) {
            if (!elemento.equals("")) {
                preRequisitos.add(Disciplina.obterDisciplina(Integer.parseInt(elemento)));
            }
        }

        disciplina.setDisciplinasForCodDisciplinaPreRequisito(preRequisitos);
        if (operacao.equals("Incluir")) {
            disciplina.gravar();
        } else {
            if (operacao.equals("Editar")) {
                disciplina.editar();
            } else {
                if (operacao.equals("Excluir")) {
                    disciplina.excluir();
                }
            }
        }
        return pesquisar();
    }

    public String voltar() {
        return "voltar";
    }

}
